package com.amigo.online.common.util;

/** 
 * Project Name:dubbo-tg-admin 
 * File Name:DemoServiceImpl.java 
 * Package Name:com.tg.dubbox.module.demo.service.impl 
 * Date:2017年2月16日下午2:11:23 
 * Copyright (c) 2017, 南京阿觅谷   All Rights Reserved. 
 * 
 */


import java.util.List;
import java.util.Set;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;

import org.apache.commons.collections4.CollectionUtils;

import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.collect.FluentIterable;


/**
 * <p>
 * 描述: 通用校验器，根据Javax Annotation进行校验和拼装错误信息
  * </p>
 * <p>
 * 版权所有: 版权所有(C)2017-2020
 * </p>
 * <p>
 * 公 司: 南京阿觅谷
 * </p>
 * <p>
 * 版本1.0: 2017年2月16日 新建
 * </p>
 * 
 * @author 臧其乐
 * @version 1.0
 */

public class CommonValidator {
	/**
	 * 线程安全的校验器
	 */
	private static Validator validator = Validation.buildDefaultValidatorFactory().getValidator();

	/**
	 * 通过Annotation校验对象，并返回错误信息
	 * 
	 * @param obj
	 * @param msgSeparator
	 * @return isValid
	 */

	public static <T> boolean validate(T obj, String msgCode, String msgSeparator) {
		String errMsg = validate(obj, msgSeparator);
		if (errMsg == null) {
			return true;
		} else {
			return false;
		}
	}
	
	/**
	 * 通过Annotation校验对象，并返回错误信息
	 * 
	 * @param obj
	 * @return isValid
	 */

	public static <T> boolean validate(T obj) {
		String errMsg = validate(obj, ",");
		if (errMsg == null) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 返回错误信息
	 * 
	 * @param obj
	 * @param msgSeparator
	 * @return errMsg
	 */

	public static <T> String validate(T obj, String msgSeparator) {
		Set<ConstraintViolation<T>> violations = validator.validate(obj);
		if (CollectionUtils.isEmpty(violations)) {
			return null;
		}
		// 拼接错误信息
		List<String> errMsgList = FluentIterable.from(violations)
				.transform(new Function<ConstraintViolation<T>, String>() {

					@Override
					public String apply(ConstraintViolation<T> violation) {
						return violation.getMessage();
					}
				}).toList();

		return Joiner.on(msgSeparator).join(errMsgList);
	}

}
